package com.aop.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author wzm
 * @create 2023-10-17 9:18
 * project_name:javaweb2308
 */
//我们可以在切面类的方法中获取连接点joinpoint的相关执行信息
//环绕通知：ProceedingJoinPoint  其他通知 JoinPoint
@Component
@Aspect
@Slf4j
public class GetJoinPointInfo {
    //定义切入点方法
    @Pointcut("@annotation(com.aop.anno.MyPoint)")
    private void pt(){}

    @Before("pt()")
    public void before(JoinPoint joinPoint){
        log.info("before...");
        joinPoint.getTarget().getClass().getName();
        joinPoint.getSignature().getName();
        joinPoint.getArgs();

    }

    @Around("pt()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            //获取目标对象的类名
        String name = proceedingJoinPoint.getTarget().getClass().getName();
        log.info("目标对象的类名：{}",name);


        //获取目标方法的方法名
        String methodName = proceedingJoinPoint.getSignature().getName();
        log.info("目标对象的方法名：{}",methodName);

        //获取目标方法的参数
        Object[] args = proceedingJoinPoint.getArgs();
        log.info("目标方法的参数列表:{}", Arrays.toString(args));

        //执行原始方法
//        proceedingJoinPoint.proceed(args);
        Object proceed = proceedingJoinPoint.proceed();

        //获取目标方法的返回值
        log.info("目标方法的返回值：{}",proceed);

        //返回
        return proceed;
    }
}
